1.4.1 构造 Region
1. 直接构造
|
|
示例:
Canvas 并没有提供针对 Region 的绘图方法,这就说明 Region 的本意并不是用来绘图的。对于上面构造的矩形填充,我们完全可以使用 Rect 来代替。
2. 间接构造
间接构造主要是通过 public Region()的空构造函数与 set 系列函数相结合来实现的。
无论调用 set 系列函数的 Region 是不是有区域值,当调用 set 系列函数后,原来的区域值就会被替换成 set 系列函数里的区域值。
其他函数不表,重点介绍 setPath() 函数:
参数:
Path path:用来构造区域的路径。
Region clip:与前面的 path 所构成的路径取交集,并将该交集设置为最终的区域。
由于路径有很多种构造方法,而且可以轻易构造出非矩形的路径,因而摆脱了前面的构造函数只能构造矩形区域的限制。但这里有一个问题,即需要指定另一个区域来取交集。当然,如果想显示路径构造的区域,那么 Region clip 参数可以传入一个比 Path 范围大得多的区域,取完交集之后,当然就是 Path path 参数所对应的区域了。
示例:
左侧分别画出了所构造的椭圆和矩形,二者相交之后,所画出的 Region 对象是如右侧图 像所示的椭圆上部分。
1.4.2 枚举区域——RegionIterator 类
对于特定的区域,可以使用多个矩形来表示其大致形状。事实上,如果矩形足够小,一定数量的矩形就能够精确表示区域的形状。也就是说,一定数量的矩形所合成的形状也可以代表区域的形状。RegionIterator 类就实现了获取组成区域的矩形集的功能。
前面提到,由于在 Canvas 中没有直接绘制 Region 的函数,想要绘制一个区域,就只能通过 RegionIterator 类构造矩形集来逼近显示区域,所以 drawRegion() 函数的具体实现如下:
首先根据区域构造一个矩形集,然后利用 next(Rect r) 函数来逐个获取所有矩形并绘制出来,最终得到的就是整个区域。如果我们想画一个椭圆区域,并且把画笔样式从 FILL 改为 STROKE,则效果更清楚。
在代码中,同样先构造了一条椭圆路径,然后在形成 Region 时传入一个与构造的椭圆区域相同大小的矩形,所以取交集之后的结果就是椭圆路径所对应的区域。效果如下图所示:
从效果图中可以明显看出,在绘制 Region 对象时,其实就是先将其转换成矩形集,然后利用画笔将每个矩形画出来而已。
1.4.3 区域相交
Region 不是用来绘图的,而是在区域的相交操作中。
1. union() 函数
|
|
该函数用于与指定矩形取并集,即将 Rect 所指定的矩形加入当前区域中。
示例:
将横向、竖向两个矩形区域合并,效果图如下:
2. 区域操作
|
|
操作结果赋给当前的 Region 对象。如果计算成功,返回 true;否则返回 false。
Op 参数值及含义:
示例:
3. op 的重载
|
|
这两个函数允许我们传入两个 Region 对象进行区域操作,并将操作结果赋给当前的 Region 对象。同样,当操作成功时,返回 true;否则返回 false。
在这里,将 region1、region2 相交的结果赋给 Region 对象。
1.4.4 其他函数
1. 几个判断方法
|
|
2. getBound 系列函数
|
|
3. 是否包含
|
|
4. 是否相交
|
|
5. 平移变换
|
|